package com.gai.shop.web.controller;

import com.gai.shop.common.Const;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

public class BaseController extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //考虑到，每个servlet只能做一个方法和对应一个路径非常的不方便，而且会导致大量的资源的浪费
        //使用参数来进行控制
        //每次路径的请求的时候，都会带上一个参数，method然后通过这个参数的值来进行判断
        //我们去调用什么方法来进行业务的处理
        //1获取参数
        String method = request.getParameter("method");
        if (method == null) {
            method = "index";
        }

//        //2使用switch 来进行业务的调用
//        switch (method){
//            case "reg":
//                //根据传递的参数调用不同的f'f方法
//                reg(request,response);
//                break;
//            case "login":
//                login(request,response);
//                break;
//            default:
//                break;
//        }

        /**
         * 第一个条件 我们的传入的method的值和我们调用的方法的名字是相同的
         * 第二个条件 我们调用的方法的参数是一样的
         * 难题是方法名都不一样
         * 使用方法名称+参数类型 就可以方法的调用
         * 反射
         */
        try {
            //1获取类对象
            Class commonController = this.getClass();
            //通过类对象进行方法的调用
            Method method1 = commonController.getMethod(method, HttpServletRequest.class, HttpServletResponse.class);
//            UserController c = new UserController();
//            c.login(request,response);
            //怎么样让这个BaseController知道我们需要做一个跳转的动作
            //方法的调用 给出的object 返回值，是当我们调用的方法返回值为void 的就是null
//            System.out.println("=========BaseController 方法调用前=========");
            //反射的方法调用
            //通过method对象调用方法的方式：invoke这个是方法的调用，他需要2个参数，第一个参数那个类进行方法的调用
            //第二个参数是一个可变长里面放的参数是：要调用的方法所需要的参数值
            Object invoke = method1.invoke(this, request, response);
//            System.out.println("=========BaseController 方法调用后=========");
            if (invoke != null) {
                String path = (String) invoke;
                String newPath = path.substring(path.indexOf(Const.COLON) + 1);
                //有路径跳转的动作
                //现在怎么样才能知道，我能做的是转发还是重定向
                //使用字符串forward:或者是redirect:,来进行判断用的路径要使用转发还是重定向
                if (path.contains(Const.FORWARD)) {
//                    System.out.println("=========BaseController 转发=========");
                    //跳转的路径 forward:/login.jsp  7 substring(7)
                    request.getRequestDispatcher(newPath).forward(request, response);
                } else if (path.contains(Const.REDIRECT)) {
//                    System.out.println("=========BaseController 重定向=========");
                    response.sendRedirect(request.getContextPath() + newPath);
                } else {
                    //也让父类帮我们处理ajax 信息写出
                    response.getWriter().println(path);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            request.setAttribute(Const.MESSAGE, "非常抱歉，页面暂时无法访问，请稍后再试");
            request.getRequestDispatcher("/message.jsp").forward(request, response);
        }
    }

    /**
     * 如果method为null就会执行这个方法，返回到首页页面index.jsp
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    public void index(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.sendRedirect(request.getContextPath() + "/index.jsp");
    }
}